package cn.icast.netty.c3;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringEncoder;
import lombok.extern.slf4j.Slf4j;

import java.net.InetSocketAddress;
@Slf4j
public class channelFuture {
    public static void main(String[] args) throws InterruptedException {
       //2.带有Future Promise的类型都是和异步方法配套使用，用来处理结果
        ChannelFuture channelFuture = new Bootstrap()
                .group(new NioEventLoopGroup())

                .channel(NioSocketChannel.class)

                .handler(new ChannelInitializer<NioSocketChannel>() {
                    @Override
                    protected void initChannel(NioSocketChannel ch) throws Exception {
                        ch.pipeline().addLast(new StringEncoder());
                    }

                })
                //1.连接服务器
                //异步非阻塞，main发起了调用，真正执行connect是nio线程，等待结果的是主线程
                .connect(new InetSocketAddress("localhost", 8080));


           // 第一种方法
          //2.1 使用sycn方法同步处理结果
        /*channelFuture.sync();  //阻塞住住当前线程，直到Nio线程连接建立完毕
        // 无阻塞向下执行获取channel,Future方法一般是和异步方法配合使用的
        Channel channel = channelFuture.channel();
        log.debug("channel{}",channel);
             //2.向服务器发送数据
        channel.writeAndFlush("hello world");*/

          //第二种方法
          //2.2 使用addListener（回调对象) 方法异步处理结果
       channelFuture.addListener(new ChannelFutureListener() {
           @Override
           // 在nio线程连接建立好之后，会调用operationComplete
           public void operationComplete(ChannelFuture future) throws Exception {
               Channel channel = future.channel();
               log.debug("channel{}",channel);
               //2.向服务器发送数据
               channel.writeAndFlush("hello world");
           }
       });

    }
}
